// 限制两位小数并且设置可最大值
export const regNumberMax = (value, max, isZero = false) => {
  let str = value.replace(/[^\d.]/g, ''); // 只允许数字
  if (isZero) {
    str = value.replace(/^[0]/g, ''); // 不允许零
  }
  str = str.replace(/\.{2,}/g, '.'); // 连续两个小数点 replace为.
  str = str.replace(/^\./g, '0.'); // 已点为开头 replace为 0.
  str = str.replace(/^(\d*)\.(\d*)\./g, '$1.$2');// 不连续点点 删掉
  str = str.replace(/^0[^\.]+/g, '0'); // 连续多个0 replace为1个0
  str = str.replace(/^(\d+)\.(\d\d).*$/, '$1.$2'); // 只允许保留小数点后2位
  const strMaxLength = max.toString().length;
  if (Number(str) > max) {
    if (str.substring(0, strMaxLength) === max.toString()) {
      str = str.substr(0, strMaxLength);
    } else {
      str = str.substr(0, strMaxLength - 1);
    }
  }
  return str;
};

// 抵扣税率等百分比配置
export function percentRate(value) {
  let str = value.replace(/[^\d.]/g, ''); // 只允许数字
  str = str.replace(/\.{2,}/g, '.'); // 连续两个小数点 replace为.
  str = str.replace(/^\./g, '0.'); // 以点为开头 replace为 0.
  str = str.replace(/^(\d*)\.(\d*)\./g, '$1.$2');// 不连续点点 删掉
  str = str.replace(/^0[^\.]+/g, '0'); // 连续多个0 replace为1个0
  str = str.replace(/^(\d+)\.(\d\d).*$/, '$1.$2'); // 只允许保留小数点后2位
  if (Number(str) > 100) {
    str = str.substring(0, 3) === '100' ? str.substr(0, 3) : str.substr(0, 2);
  }
  return str;
}

// 保留2位小数，纯数字，输入位数≤9位数，支持正负和0
export function taxCost(value) {
  let str = value.replace(/[^\-?\d.]/g, ''); // 允许正负数字
  str = str.replace(/\.{2,}/g, '.'); // 连续两个小数点 replace为.
  str = str.replace(/\-{2,}/g, '-'); // 不能多个负号 replace为-
  str = str.replace(/^(\d*)\-(\d*)\-/g, '-$1$2');// 不连续-- 删掉后面一个-
  str = str.replace(/^\./g, '0.'); // 以点为开头 replace为 0.
  str = str.replace(/^\-\./g, '-0.'); // 以-.为开头 replace为 -0.
  str = str.replace(/\.\-/g, '.');// .-和非-.开头的替换为.
  str = str.replace(/^(\d*)\.(\d*)\./g, '$1.$2');// 不连续点
  str = str.replace(/\-\./g, '.');// -.的替换为.
  str = str.replace(/^0[^\.]+/g, '0'); // 连续多个0 replace为1个0
  str = str.replace(/^\-0[^\.]+/g, '-0'); // -后连续多个0 replace为1个0
  str = str.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'); // 只允许保留小数点后2位

  if (Number(str) > 999999999) {
    str = str.substr(0, 9);
  } else if (Number(str) < -999999998) {
    str = str.substr(0, 10);
  } else {
    return str;
  }
  return str;
}

// 保留2位小数，纯数字，输入位数≤16位数，支持正数和0
export function price(value) {
  let str = value.replace(/[^\d.]/g, ''); // 允许正负数字
  str = str.replace(/\.{2,}/g, '.'); // 连续两个小数点 replace为.
  str = str.replace(/\-{2,}/g, '-'); // 不能多个负号 replace为-
  str = str.replace(/^(\d*)\-(\d*)\-/g, '-$1$2');// 不连续-- 删掉后面一个-
  str = str.replace(/^\./g, '0.'); // 以点为开头 replace为 0.
  str = str.replace(/^\-\./g, '-0.'); // 以-.为开头 replace为 -0.
  str = str.replace(/\.\-/g, '.');// .-和非-.开头的替换为.
  str = str.replace(/\-\./g, '.');// -.的替换为.
  str = str.replace(/^(\d*)\.(\d*)\./g, '$1.$2');// 不连续点点 删掉
  str = str.replace(/^0[^\.]+/g, '0'); // 连续多个0 replace为1个0
  str = str.replace(/^\-0[^\.]+/g, '-0'); // -后连续多个0 replace为1个0
  str = str.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'); // 只允许保留小数点后2位

  const strArr = str.split('.');

  if (Number(str) > 9999999999999999 || strArr[0] === '9999999999999999') {
    str = str.substr(0, 16);
  } else if (Number(str) < -9999999999999998) {
    str = str.substr(0, 17);
  }
  return str;
}

// 用于计算的数值 默认保留5位小数（可选 2， 3， 5），默认输入位数小于16位（可自定义）
export const numerical = (value, decimalNum = 5, digit = 16) => {
  let str = value.replace(/[^\d.]/g, ''); // 只允许数字
  // str = str.replace(/^\d{10}$/, str.substring(0, str.length - 1)); // 出现第10位数值将它截取掉
  str = str.replace(/\.{2,}/g, '.'); // 连续两个小数点 replace为.
  str = str.replace(/^\./g, '0.'); // 已点为开头 replace为 0.
  str = str.replace(/^(\d*)\.(\d*)\./g, '$1.$2');// 不连续点点 删掉
  str = str.replace(/^0[^\.]+/g, '0'); // 连续多个0 replace为1个0
  if (decimalNum === 2) {
    str = str.replace(/^(\d+)\.(\d\d).*$/, '$1.$2'); // 只允许保留小数点后2位
  } else if (decimalNum === 3) {
    str = str.replace(/^(\d+)\.(\d\d\d).*$/, '$1.$2'); // 只允许保留小数点后3位
  } else {
    str = str.replace(/^(\d+)\.(\d\d\d\d\d).*$/, '$1.$2'); // 只允许保留小数点后5位
  }

  if (str.indexOf('.') < 0) {
    if (str.length > digit) {
      str = str.substring(0, str.length - 1);
    }
  } else {
    let integer = str.split('.')[0];
    const decimal = str.split('.')[1];
    if (integer.length > digit) {
      integer = integer.substring(0, integer.length - 1);
      str = integer + '.' + decimal;
    }
  }
  return str;
};

// 编码类的 正则判断 只允许英文字母和和数字
export const codelimit = (value) => {
  let str = value.replace(/[\u4E00-\u9FA5]|[\uFE30-\uFFA0]/g, '');
  str = str.replace(/[^\d.|[a-zA-Z]/g, ''); // 只允许数字
  return str;
};
